home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 73
/
PCMania CD73_1.iso
/
pcmania
/
metafo73
/
SRC.ZIP
/
QUIMICA.C
next >
Wrap
Text File
|
1998-09-25
|
7KB
|
289 lines
/****************************************************************************
Copyright (C) 1998 by Rafael Hernández Moreno
*****************************************************************************
GARANTIA
El programa se proporciona sin ninguna garantía, explícita o
implícita y no existe garantía sobre la funcionalidad del código
fuente, módulos objeto, módulos ejecutables y ficheros de datos
que use. El autor no será responsable por cualquier daño o
perjuicio causado por el uso o mal uso de este producto.
No hay garantías de que este programa se ejecute sin errores o
haga exactamente lo que el autor o el usuario intentaban hacer.
Este programa no debe ser utilizado junto a aplicaciones o en sistemas
donde el funcionamiento erróneo del mismo pueda causar pérdida o
daños a la propiedad o salud de cualquier persona.
DISCLAIMER AND WARRANTY
Product is supplied as is and author disclaims all warranties,
explicit or implied, about the functionality of the source code,
object modules supplied, executable modules and data,and shall not be held
responsible for any damages caused by the use or misuse of this product.
And, there is no warranty that this program performs without errors,
or does exactly what you or I intended. So it should NOT be
used in applications in which malfunction of routines of this
package would result in loss or damage to property or health of any
person without *very* extensive testing under all kinds of loads.
In using it, you do so at your own risk.
*/
#include <graphics.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define LMOLEC 20 /* Longitud maxima de las moleculas */
#define NREAC 100
#define NMOLS 20
#define ALICUOTA 0.1 /* Cantidad de reactivos que intervienen en cada reacción */
typedef struct _reaccion_
{
int molec1, molec2, enzima, producto;
double velocidad;
} reaccion;
typedef struct _molecula_
{
char m[LMOLEC];
double cn; /* concentracion */
} molecula;
void inicializa_drivers(void);
int crea_molecula(int);
int mezcla_quimica(void);
int grafo_reacciones(void);
int reacciones(int);
int presentacion_cabecera(void);
int presentacion(int);
reaccion reacc[NREAC];
molecula mol[NMOLS];
int x_hi, y_hi;
int numreacciones, nummolecs;
void inicializa_drivers(void)
{
int driver_graf=DETECT, modo_graf, error_graf;
detectgraph(&driver_graf, &modo_graf);
error_graf = graphresult();
if (error_graf <0)
{
printf( "Error gráfico : %s.\n", grapherrormsg(error_graf));
exit(1);
}
if (driver_graf == VGA)
{
modo_graf = VGAHI;
x_hi=639;
y_hi=479;
registerbgidriver(EGAVGA_driver);
}
else
{
printf("Driver gráfico no soportado\n");
exit(1);
}
error_graf = graphresult();
if (error_graf <0)
{
printf("Error gráfico : %s.\n", grapherrormsg(error_graf));
exit(1);
}
initgraph(&driver_graf, &modo_graf, "");
error_graf = graphresult();
if (error_graf <0)
{
printf("Error gráfico al inicializar el driver : %s.\n", grapherrormsg(error_graf));
exit(1);
}
}
int crea_molecula(int i)
{
int j, l;
l = random(LMOLEC - 2) + 2; /* longitud al menos > 2 */
mol[i].m[0] = 0;
for (j = 0; j < l; ++j)
{
if (random(100) < 50) strcat(mol[i].m, "a");
else strcat(mol[i].m, "b");
}
return 0;
}
int mezcla_quimica(void)
{
int i;
/* Las dos primeras moléculas son los elementos de partida */
/* No pueden ser nunca productos */
/* Y se van a mantener a concentración constante, "no se gastan" */
/* o lo que es lo mismo siempre se está añadiendo ingredientes de partida */
/* a nuestra sopa química */
mol[0].m[0] = 0;
strcpy(mol[0].m, "a");
mol[0].cn = 1.0;
mol[1].m[0] = 0;
strcpy(mol[1].m, "b");
mol[1].cn = 1.0;
for (i = 2; i < nummolecs; ++i)
{
crea_molecula(i);
mol[i].cn = 1.0;
}
return 0;
}
int grafo_reacciones(void)
{
int i;
for (i = 0; i < numreacciones; ++i)
{
reacc[i].molec1 = random(NMOLS);
reacc[i].molec2 = random(NMOLS);
reacc[i].enzima = random(NMOLS);
/* Las dos primeras moléculas no pueden ser productos */
reacc[i].producto = random(NMOLS - 2) + 2;
reacc[i].velocidad = (random(32000) * 1.0) / 32000;
}
return 0;
}
int reacciones(int i)
{
double gasto;
/* Si no hay reactivos ni enzima suficientes no se realiza la reacción */
gasto = ALICUOTA * reacc[i].velocidad;
if ((reacc[i].molec1 == reacc[i].molec2) && (reacc[i].molec1 < (2 * gasto)))
return 0;
if (mol[reacc[i].molec1].cn < gasto) return 0;
if (mol[reacc[i].molec2].cn < gasto) return 0;
/* La enzima no se gasta en la reaccion, pero debe existir */
if (mol[reacc[i].enzima].cn < gasto) return 0;
/* Las dos moléculas iniciales 0 y 1 no se gastan nunca son los nutrientes */
if (reacc[i].molec1 > 1) mol[reacc[i].molec1].cn -= gasto;
if (reacc[i].molec2 > 1) mol[reacc[i].molec2].cn -= gasto;
reacc[i].producto += 2 * gasto;
return 0;
}
int presentacion_cabecera(void)
{
int i, yy;
for (i = 0; i < nummolecs; ++i)
{
yy = i * 20 + 20;
outtextxy(0, yy, mol[i].m);
outtextxy(150, yy, " : ");
presentacion(i);
}
return 0;
}
int presentacion(int i)
{
int yy;
char linea[80];
yy = i * 20 + 20;
setviewport(200, yy - 9, x_hi, yy + 12, 1);
clearviewport();
setviewport(0, 0, x_hi, y_hi, 1);
linea[0] = 0;
sprintf(linea, "%f", mol[i].cn);
outtextxy(200, yy, linea);
bar3d(300, yy + 10, 300 + (mol[i].cn * 100), yy, 10, 1);
return 0;
}
int main(int argc, char **argv)
{
int i;
char c = 0;
int salir = 0;
if (argc != 3)
{
printf("Sintaxis : \n %s <numreacciones> <nummolecs>\n", argv[0]);
return 0;
}
numreacciones = atoi(argv[1]);
if (numreacciones > NREAC) numreacciones = NREAC;
nummolecs = atoi(argv[2]);
if (nummolecs > NMOLS) nummolecs = NMOLS;
mezcla_quimica();
grafo_reacciones();
inicializa_drivers();
presentacion_cabecera();
do
{
i = random(NREAC);
reacciones(i);
presentacion(reacc[i].molec1);
presentacion(reacc[i].molec2);
presentacion(reacc[i].producto);
if (kbhit()) c = getch();
if (c == 'q') salir = 1;
} while (!salir);
closegraph();
return 0;
}